﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net;
using System.Web.Services;
using Iudicium.Utilitarios;
using Iudicium.Servicio.CRN;
using Iudicium.Servicio;
using Iudicium.Procesos.CRN;
using Iudicium.Procesos;
using Iudicium.Servicios.CRN;

public partial class Servicios_Proceso_FormularioProceso : System.Web.UI.Page
{
    private static readonly ILog log = LogManager.GetLogger("LogFile");

    private int ProcesoId
    {
        set { ProcesoIdHiddenField.Value = value.ToString(); }
        get
        {
            int EtapaProcesoId = 0;
            try
            {
                EtapaProcesoId = Convert.ToInt32(ProcesoIdHiddenField.Value);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo convertir ProcesoIdHiddenField.Value a un valor entero", ex);
            }
            return EtapaProcesoId;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ObtenerParametros();
            Session["ActividadBackToUrl"] = null;
            Session["TransaccionBackToUrl"] = null;
        }
        if (ProcesoId == 0)
        {
            CodigoProcesoPanel.Visible = false;
            FinalizarProcesoLinkButton.Visible = false;
            EstadoPanel.Visible = false;
            FechaInicioDescripcionLabel.Visible = false;
            OptionsPanel.Visible = false;
        }
    }

    private void ObtenerParametros()
    {
        if (Session["ServicioId"] != null && !string.IsNullOrEmpty(Session["ServicioId"].ToString()))
        {
            ProcesoIdHiddenField.Value = Session["ServicioId"].ToString();
            CargarDatos();
        }
        Session["ServicioId"] = null;
    }

    private void CargarDatos()
    {
        if (ProcesoId <= 0)
            return;

        Proceso objProceso = null;
        try
        {
            objProceso = ProcesoCRN.GetProcesoById(ProcesoId);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener el Proceso con id: " + ProcesoId, ex);
        }
        if (objProceso == null)
            return;

        CodigoProcesoDescriptionLabel.Text = objProceso.CodigoServicio;
        TipoProceso objcat = null;

        try
        {
            objcat = TipoProcesoCRN.GetTipoProcesoByEtapa(objProceso.EtapaProcesoId);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener la Tipo del Proceso a partir de la etapa Id", ex);
        }
        if (objcat != null)
        {
            TipoLiteral.Text = objcat.Descripcion;
            TipoDropDownList.SelectedValue = objcat.TipoprocesoId.ToString();
        }

        MinDateLiteral.Text = "new Date(" + objProceso.FechaInicio.Year + "," + (objProceso.FechaInicio.Month - 1) + "," + objProceso.FechaInicio.Day + ")";
        EtapaProcesoIdHiddenField.Value = objProceso.EtapaProcesoId.ToString();
        FechaInicioDescripcionLabel.Text = objProceso.FechaInicio.ToShortDateString();
        FechaInicioDescripcionLabel.Visible = true;
        FechaEntregaEstimadaLiteral.Text = objProceso.FechaEntregaEstimada.ToShortDateString();
        FechaInicioTextBox.Visible = false;
        SelectedDateLiteral.Text = "new Date(" + objProceso.FechaEntregaEstimada.Year + "," + (objProceso.FechaEntregaEstimada.Month - 1) + "," + objProceso.FechaEntregaEstimada.Day + ")";
        ObservacionTextBox.Text = objProceso.Observacion;
        MontoDemandaTextBox.Text = objProceso.MontoDemanda.ToString();
        NumeroExpedienteTextBox.Text = objProceso.NumeroExpediente;       
        DescripcionEstadoLabel.Text = objProceso.Estado;
        InvolucradosSelector.ProcesoId = ProcesoId;
        ResponsablesSelector.ServicioId = ProcesoId;
        OptionsPanel.Visible = true;

        if (objProceso.Estado.Equals("Finalizado") || objProceso.Estado.Equals("Entregado"))
        {
            CancelarHyperlink.Text = "Volver a la Lista de Procesos";
            GuardarLinkButton.Visible = false;
            FinalizarProcesoLinkButton.Visible = false;
            TipoDropDownList.Visible = false;
            TipoLiteral.Visible = true;
            EtapaProcesoDropDownList.Visible = false;
            EtapaProcesoLiteral.Visible = true;
            //InvolucradosSelector.ReadOnly = true;
            ResponsablesSelector.ReadOnly = true;
            FechaEntregaEstimadaLiteral.Visible = true;
            FechaEntregaEstimadaTextBox.Visible = false;
            ObservacionTextBox.ReadOnly = true;
            FechaFinLiteral.Text = objProceso.FechaFin.ToShortDateString();
            FechaFinalizacionPanel.Visible = true;
            try
            {
                EtapaProceso objEtapaProceso = EtapaProcesoCRN.GetEtapaProcesoById(objProceso.EtapaProcesoId, objcat.TipoprocesoId);
                EtapaProcesoLiteral.Text = objEtapaProceso.Descripcion;
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener el tipo de Proceso al que pertenece el Proceso con id " + ProcesoId, ex);
            }
            if (objProceso.Estado.Equals("Entregado"))
            {
                EntregarProcesoHyperLink.Visible = false;
                EntregadoALiteral.Text = string.IsNullOrEmpty(objProceso.EntregadoA) ? "-" : objProceso.EntregadoA;
                DescripcionObservacionEntregaTextBox.Text = string.IsNullOrEmpty(objProceso.ObservacionEntrega) ? "-" : objProceso.ObservacionEntrega;
                FechaEntregaLiteral.Text = objProceso.FechaEntrega.ToShortDateString();
                DatosEntregaPanel.Visible = true;
            }
            else
            {
                EntregarProcesoHyperLink.Visible = true;
            }
        }
        else
        {
            CancelarHyperlink.Text = "Cancelar cambios y Volver a la Lista de Procesos";
            EntregarProcesoHyperLink.Visible = false;
            FinalizarProcesoLinkButton.Visible = true;
        }
    }

    protected void GuardarLinkButton_Click(object sender, EventArgs e)
    {
        GuardarProceso();
    }

    protected void EtapaProcesoDropDownList_DataBound(object sender, EventArgs e)
    {
        EtapaProcesoDropDownList.Items.Insert(0, new ListItem("Seleccione una Etapa de Proceso", ""));
        EtapaProcesoDropDownList.SelectedValue = EtapaProcesoIdHiddenField.Value;
    }

    protected void TipoDropDownList_DataBound(object sender, EventArgs e)
    {
        TipoDropDownList.Items.Insert(0, new ListItem("Seleccione un Tipo de Proceso", ""));
    }

    protected void FinalizarProcesoLinkButton_Click(object sender, EventArgs e)
    {
        if (!GuardarProceso())
            return;
        DateTime fechaFin = DateTime.Now;
        try
        {
            fechaFin = Convert.ToDateTime(FechaFinalizacionHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaFinalizacionHiddenField.Value a un valor DateTime", ex);
        }
        try
        {
            ServicioCRN.FinalizarServicio(ProcesoId, fechaFin);
            Notificacion.MostrarNotificacion("El Proceso se ha finalizado correctamente.", Notificacion.TipoNotificacion.Alert);
        }
        catch (Exception ex)
        {
            log.Error("El Proceso con id " + ProcesoId + " no pudo ser finalizado", ex);
            Notificacion.MostrarNotificacion("Ocurrio un error al finalizar el Proceso.", Notificacion.TipoNotificacion.Error);
            ControlNotificacion.Update();
            return;
        }
        Session["ServicioId"] = ProcesoId;
        Response.Redirect("~/Servicios/Proceso/FormularioProceso.aspx");
    }

    protected void ActividadesLinkButton_Click(object sender, EventArgs e)
    {
        Session["ActividadBackToUrl"] = "~/Servicios/Proceso/FormularioProceso.aspx";
        Session["ServicioId"] = ProcesoId;
        Response.Redirect("~/Servicios/Actividad/ListaActividades.aspx");
    }

    protected void TransaccionesLinkButton_Click(object sender, EventArgs e)
    {
        Session["TransaccionBackToUrl"] = "~/Servicios/Proceso/FormularioProceso.aspx";
        Session["ServicioId"] = ProcesoId;
        Response.Redirect("~/Servicios/Transaccion/ListaTransacciones.aspx");
    }

    protected void EntregarProcesoLinkButton_Click(object sender, EventArgs e)
    {
        DateTime fechaFin = DateTime.Now;
        try
        {
            fechaFin = Convert.ToDateTime(FechaFinalizacionHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaFinalizacionHiddenField.Value a un valor DateTime", ex);
        }
        try
        {
            ServicioCRN.EntregarServicio(ProcesoId, fechaFin, EntregadoATextBox.Text, ObservacionEntregaTextBox.Text);
            Notificacion.MostrarNotificacion("El Proceso se ha entregado correctamente.", Notificacion.TipoNotificacion.Alert);
        }
        catch (Exception ex)
        {
            log.Error("El Proceso con id " + ProcesoId + " no pudo ser finalizado", ex);
            Notificacion.MostrarNotificacion("Ocurrio un error al entregar el Proceso.", Notificacion.TipoNotificacion.Error);
            ControlNotificacion.Update();
            return;
        }
        Session["ServicioId"] = ProcesoId;
        Response.Redirect("~/Servicios/Proceso/FormularioProceso.aspx");
    }

    private bool GuardarProceso()
    {
        DateTime fechaInicio = DateTime.Now;
        try
        {
            fechaInicio = Convert.ToDateTime(FechaInicioTextBox.Text);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaInicioTextBox.Text a un valor de Fecha", ex);
        }

        DateTime fechaEntregaEstimada = DateTime.Now;
        try
        {
            fechaEntregaEstimada = Convert.ToDateTime(FechaEntregaEstimadaTextBox.Text);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaEntregaEstimadaTextBox.Text a un valor de Fecha", ex);
        }

        int EtapaProcesoId = 0;
        try
        {
            EtapaProcesoId = Convert.ToInt32(EtapaProcesoIdHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir a un valor entero", ex);
        }

        Proceso objProceso = new Proceso(ProcesoId,
            CodigoProcesoDescriptionLabel.Text,
            fechaInicio,
            DateTime.Now,
            fechaEntregaEstimada,
            ObservacionTextBox.Text,
            "En Proceso",
            EtapaProcesoId,
            NumeroExpedienteTextBox.Text,
            Convert.ToDecimal(MontoDemandaTextBox.Text));

        string codigo = "";
        if (ProcesoId == 0)
        {
            try
            {
                int procesoId = Iudicium.Procesos.CRN.ProcesoCRN.InsertProceso(objProceso, ref codigo);
                Notificacion.MostrarNotificacion("El Proceso con Codigo: " + codigo + " se guardo correctamente.", Notificacion.TipoNotificacion.Alert);

                CodigoProcesoDescriptionLabel.Text = codigo;
                ProcesoId = ProcesoId;
                DescripcionEstadoLabel.Text = "En Proceso";
                CodigoProcesoPanel.Visible = true;
                EstadoPanel.Visible = true;
                MinDateLiteral.Text = "new Date(" + objProceso.FechaInicio.Year + "," + (objProceso.FechaInicio.Month - 1) + "," + objProceso.FechaInicio.Day + ")";
                SelectedDateLiteral.Text = "new Date(" + objProceso.FechaEntregaEstimada.Year + "," + (objProceso.FechaEntregaEstimada.Month - 1) + "," + objProceso.FechaEntregaEstimada.Day + ")";
                FechaInicioDescripcionLabel.Text = objProceso.FechaInicio.ToShortDateString();
                FechaInicioDescripcionLabel.Visible = true;
                FechaInicioTextBox.Visible = false;
                InvolucradosSelector.ProcesoId = ProcesoId;

                List<ResponsableJSON> nuevosResponsables = ResponsablesSelector.NuevosResponsables;
                foreach (ResponsableJSON json in nuevosResponsables)
                {
                    if (json == null)
                    {
                        log.Error("No se pudo insertar el responsable por que el objeto JSON es nulo");
                    }

                    try
                    {
                        Responsable objResponsable = new Responsable(0, procesoId, json.AdministrativoId, "", Convert.ToDateTime(json.FechaInicio), Convert.ToDateTime(json.FechaInicio), Responsable.EstadoResponsable.Activo);
                        ResponsableCRN.InsertResponsableActivo(objResponsable);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + json.AdministrativoId + " para el servicio " + ProcesoId, ex);
                    }
                }
                InvolucradoCRN.InsertInvolucradosProceso(procesoId,InvolucradosSelector.DemandantesInsertados,InvolucradosSelector.DemandadosInsertados);
              
                ResponsablesSelector.ServicioId = procesoId;
                ResponsablesSelector.Update();
                InvolucradosSelector.Update();
                ControlNotificacion.Update();
                OptionsPanel.Visible = true;
                FinalizarProcesoLinkButton.Visible = true;
                CancelarHyperlink.Text = "Cancelar cambios y Volver a la Lista de Procesos";
            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error al guardar los datos del Proceso", ex);
                Notificacion.MostrarNotificacion("Ocurrio un error al Guardar los Datos del Proceso.", Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return false;
            }
        }
        else
        {
            try
            {
                Iudicium.Procesos.CRN.ProcesoCRN.UpdateProceso(objProceso, InvolucradosSelector.InvolucradosEliminados, InvolucradosSelector.DemandadosInsertados);
                InvolucradosSelector.Update();
                //Nuevos responsables
                List<ResponsableJSON> nuevosResponsables = ResponsablesSelector.NuevosResponsables;
                foreach (ResponsableJSON json in nuevosResponsables)
                {
                    if (json == null)
                    {
                        log.Error("No se pudo insertar el responsable por que el objeto JSON es nulo");
                    }
                    Responsable objResponsable = new Responsable(0, objProceso.ServicioId, json.AdministrativoId, "", Convert.ToDateTime(json.FechaInicio), Convert.ToDateTime(json.FechaInicio), Responsable.EstadoResponsable.Activo);
                    try
                    {
                        ResponsableCRN.InsertResponsableActivo(objResponsable);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + json.AdministrativoId + " para el servicio " + objProceso.ServicioId, ex);
                    }
                }
                //Nuevos responsables inactivos
                List<ResponsableJSON> nuevosResponsablesInactivos = ResponsablesSelector.ResponsablesParaHistorial;
                foreach (ResponsableJSON json in nuevosResponsablesInactivos)
                {
                    if (json == null)
                    {
                        log.Error("No se pudo insertar el responsable por que el objeto JSON es nulo");
                    }
                    Responsable objResponsable = new Responsable(0, objProceso.ServicioId, json.AdministrativoId, "", DateTime.Now, Convert.ToDateTime(json.FechaFin), Responsable.EstadoResponsable.Inactivo);
                    try
                    {
                        ResponsableCRN.InsertResponsableInactivo(objResponsable);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + json.AdministrativoId + " para el servicio " + objProceso.ServicioId, ex);
                    }
                }
                //Responsables a eliminar
                List<int> responsablesAEliminar = ResponsablesSelector.ResponsablesEliminados;
                foreach (int id in responsablesAEliminar)
                {
                    if (id <= 0)
                    {
                        log.Error("No se pudo insertar el responsable por que el administrativoId es menor o igual que cero.");
                    }
                    try
                    {
                        ResponsableCRN.EliminarResponsableActivo(objProceso.ServicioId, id);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + id + " para el servicio " + objProceso.ServicioId, ex);
                    }
                }
                ResponsablesSelector.ServicioId = objProceso.ServicioId;

                SelectedDateLiteral.Text = "new Date(" + objProceso.FechaEntregaEstimada.Year + "," + (objProceso.FechaEntregaEstimada.Month - 1) + "," + objProceso.FechaEntregaEstimada.Day + ")";
                ResponsablesSelector.Update();

                Notificacion.MostrarNotificacion("Los datos del Proceso se guardaron correctamente.", Notificacion.TipoNotificacion.Alert);
                ControlNotificacion.Update();
            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error al guardar los datos del Proceso", ex);
                Notificacion.MostrarNotificacion("Ocurrio un error al Guardar los Datos del Proceso.", Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return false;
            }
        }
        return true;
    }

    [WebMethod]
    public static List<Iudicium.Procesos.EtapaProceso> GetEtapaProcesos(string id)
    {
        try
        {
            List<Iudicium.Procesos.EtapaProceso> lista = Iudicium.Procesos.CRN.EtapaProcesoCRN.GetEtapaProcesoBySearch("", id);
            return lista;
        }
        catch (Exception ex)
        {
            log.Error("No se pudo cargar las etapas de Procesos a partir del tipo de Proceso", ex);
        }
        return new List<Iudicium.Procesos.EtapaProceso>();
    }
}
